package com.cskaoyan.javase.oop1._6constructor._2this;

/**
 * 构造器中的this关键字
 * 构造器中的this和成员方法中的this类似,指向当前对象
 * 可以用"this."访问同类中的成员变量/方法 这一点使用和成员方法中的this没有区别
 *
 * 但是构造器中的this有自身独有的用法：
 * 在一个类的构造器的第一行,可以使用以下语法:
 *      this(实参列表);
 * 用于表示调用同类中的某个构造器!
 * 注: this关键字在构造器中表示调用自身其他构造器时,该语句必须写在构造器代码的第一行(原因下周讲)
 *
 * 构造器中一旦存在this调用其他构造器,执行顺序是:
 *      1.new对象的构造器,首先被调用.它的方法栈帧首先进栈
 *      2.new对象的构造器中,存在this调用自身其他构造器
 *          于是会去调用this构造器,this构造器方法栈帧进栈
 *      3.如果代码中有显式赋值,就执行显式赋值,如果没有那就不执行
 *      4.接下来,执行this构造器代码
 *          因为this构造器方法栈帧后进栈,处在栈顶,是当前正在执行的方法
 *      5.接下来,再执行new对象的构造器代码
 *          new对象的构造器执行完毕,创建对象过程的赋值手段就执行完了
 *      以上构造器的执行顺序,是方法栈帧"先进后出"保证的
 *
 * @since 10:57
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Dog d = new Dog("大黄", 5, "黑色");
    }
}

class Dog {
    String name = "大黑";
    int age;
    String color;

    public Dog() {
        /*System.out.println(age);
        System.out.println(name);
        System.out.println(this.name);
        eat();
        this.eat();*/
    }

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Dog(String name, int age, String color) {
        /*this.name = name;
        this.age = age;*/
        // System.out.println();
        // Call to 'this()' must be first statement in constructor body
        // 以上代码就是双参构造器,可以用this调用它
        this(name, age);
        this.color = color;
    }

    public void eat() {
        System.out.println("它吃狗粮!");
    }
}